package com.msb.api.filter.impl;

import com.msb.api.feign.BeaconCacheClient;
import com.msb.api.filter.CheckFilter;
import com.msb.common.constart.ApiConstant;
import com.msb.common.constart.CacheConstant;
import com.msb.common.enums.ExceptionEnums;
import com.msb.common.exception.GraceException;
import com.msb.common.model.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

/**
 * @Author: lmf
 * @Create: 2025/3/7 9:10
 * Description: 模板验证
 */
@Service("template")
@Slf4j
public class TemplateCheckFilter implements CheckFilter {
    @Resource
    private BeaconCacheClient cacheClient;

    @Override
    public void check(StandardSubmit submit) {

        String TEMPLATE_TEXT = "templateText";
        String TEMPLATE_PLACEHOLDER = "#";

        log.info("模板-TemplateCheckFilter");
        // 1、从submit中获取到短信内容，签名信息，签名id
        String text = submit.getText();
        String sign = submit.getSign();
        Long signId = submit.getSignId();
        // 2、将短信内容中的签名直接去掉，获取短信具体内容
        text = text.replace(ApiConstant.SIGN_PREFIX + sign + ApiConstant.SIGN_SUFFIX, "");
        // 3、从缓存中获取到签名id绑定的所有模板
        Set<Map<String, Object>> mapSet = cacheClient.sMembers(CacheConstant.CLIENT_TEMPLATE + signId);
        if (mapSet == null || mapSet.isEmpty()) {
            GraceException.display(ExceptionEnums.ERROR_TEMPLATE);
        }
        // 4、在tempaltes不为null时，遍历签名绑定的所有模板信息
        for (Map<String, Object> map : mapSet) {
            String templateText = (String) map.get(TEMPLATE_TEXT);

            if (Objects.equals(text, templateText)) {
                log.info("【通过模板】验证后的信息：{}-没有变量", submit);
            }

            // 4.2 文本需要有内容，只能一个变量， 并且文本不能只有变量没有值
            // 例子：您的验证码是#code#。如非本人操作，请忽略本短信
            if (
                    templateText != null
                            && templateText.contains(TEMPLATE_PLACEHOLDER)
                            // 说明只有两个# 只有一个变量
                            && (templateText.length() - templateText.replaceAll(TEMPLATE_PLACEHOLDER, "").length()) == 2
            ) {
                // 短信内容变量前缀
                String templateTextPrefix = templateText.substring(0,
                        templateText.indexOf(TEMPLATE_PLACEHOLDER));
                // 短信内容变量后缀
                String templateTextSuffix = templateText.substring(templateText.lastIndexOf(TEMPLATE_PLACEHOLDER) + 1);

                // 前后文本符合模板允许通过
                if (text.startsWith(templateTextPrefix) && text.endsWith(templateTextSuffix)) {
                    log.info("【通过模板】验证后的信息：{}-有变量", submit);
                    return;
                }
            }
            GraceException.display(ExceptionEnums.ERROR_TEMPLATE);
        }
    }
}
